
# 异常和错误
"""
1. 代码的运行逻辑
    (1). 解析和编译 ，会检查编写代码的语法和结构是否正确 ，若出现这类问题 ，直接报错 ，将不启动执行(错误)。
    (2) .执行 ，生成的字节码按照顺序一条一条的执行 ，若在执行过程中出现了问题 ，也会报错 ，代码也将不会往下执行 。比如: 索引越界
        在执行过程中出错，往往都是没有考虑到或外部环境发生变化 。(异常)

2. 错误 ：编写代码触发了Python的硬性规定 ，一般编辑器中会有红色的波浪线或标识为error .
    比如 ： 不能使用关键字定义变量 ，缩进问题 ，传递数量不一致 。

3. 异常 ：在执行过程中遇到的错误 ，Python会抛出一个异常 ，比如索引越界。

4. 异常处理方式：
try:
    可能执行错误的代码块
except:
    对错误代码进行处理
其它模块

5. 异常可以分类 ：通过分类，可以更准确的知道异常类型 ，提示可以更加准确

BaseException：所有异常的基类，用于处理所有异常情况。
Exception：常规异常的基类，用于处理大多数异常情况。
TypeError：类型错误，例如对非数字对象进行数学运算。
ValueError：数值错误，例如将一个字符串作为数字进行数学运算。
IndexError：索引错误，例如使用超出序列长度的索引值。
KeyError：字典键错误，例如使用不存在的字典键。
AttributeError：属性错误，例如尝试访问一个对象不存在的属性。
IOError：输入/输出错误，例如读写文件时发生错误。
ValueErrorException：与具体编程相关的错误，例如传递错误的参数类型或参数值。
ZeroDivisionError：除零错误，例如执行除以零的操作。
FileNotFoundError ： 文件不存在错误 ，例如找不到文件
UnicodeDecodeError: 文件编码错误 ，读取编码格式不正确


6. finally : 在运行代码过程中，希望某段必须运行 ，就可以放在finally语句中 。
    （1）. 使用在特定场景 ，比如关闭资源
    (2) . except语句和finally语句之间不能加其它代码 。
"""
print("hello world")
# def = 'hello world'     # 语法错误

x = [1,2,3]
try:
    print(x[2])
except Exception as e:
    print(e)

print("end")

f = None
filename = 'a.txt'

try:
    # 1. 打开文件
    f = open(filename,encoding='utf-8',mode='r')

    # 2. 读取文件内容
    content = f.read()
    print("读取文件内容为:{}".format(content))
except FileNotFoundError as e:
    print("文件不存在:{}".format(e))
except UnicodeDecodeError as e:
    print("文件编码不正确，请检查:{}".format(e))
except Exception as e:
    print("未知错误:{}".format(e))
# 3. 关闭文件
finally:
    if f:
        f.close()